package dao;

import java.util.List;
import modelo.Funcao;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import util.HibernateUtil;

public class FuncaoDAOHibernate implements FuncaoDAO {

    @Override
    public boolean criar(Funcao funcao) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            sessao.save(funcao);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public Funcao pesquisar(String descricao) {
        Funcao modelo = null;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Query consultaDescricao = sessao.createQuery("from Funcao f where f.descricao like :descricao");
            consultaDescricao.setString("descricao", "%" + descricao + "%");
            modelo = (Funcao) consultaDescricao.uniqueResult();
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return modelo;
    }

    @Override
    public List<Funcao> listar() {
        List<Funcao> lista = null;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        String sql = "from Funcao";
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            lista = sessao.createQuery(sql).list();
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return lista;
    }

    @Override
    public boolean alterar(Funcao funcao) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Funcao funcaoDB = (Funcao) sessao.load(Funcao.class, funcao.getCodFuncao());
            funcaoDB.setNome(funcao.getNome());
            funcaoDB.setDescricao(funcao.getDescricao());
            funcaoDB.setEstado(funcao.getEstado());
            sessao.update(funcaoDB);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

    @Override
    public boolean excluir(Funcao funcao) {
        boolean flag;
        Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            //sessao.beginTransaction();
            sessao.getTransaction().begin();
            Funcao funcaoDB = (Funcao) sessao.load(Funcao.class, funcao.getCodFuncao());
            sessao.delete(funcaoDB);
            //sessao.beginTransaction().commit();
            sessao.getTransaction().commit();
            flag = true;
        } catch (HibernateException e) {
            System.err.println("Exceção:" + e);
            flag = false;
            //sessao.beginTransaction().rollback();
            sessao.getTransaction().rollback();
        }
        return flag;
    }

}
